package ubo.master1.jeupoker.gui;

/**
 * Générer des cartes de jeu 
**/
public class LaCart implements Comparable<LaCart> {
    
    /** Nombre de cartes numérotés. */
    public static final int NO_OF_RANKS = 13;
    
    /** Nombre de carte en couleurCarte */
    public static final int NO_OF_SUITS = 4;
    
    // Les cartes numérotés.
    public static final int ACE      = 12;
    public static final int KING     = 11;
    public static final int QUEEN    = 10;
    public static final int JACK     = 9;
    public static final int TEN      = 8;
    public static final int NINE     = 7;
    public static final int EIGHT    = 6;
    public static final int SEVEN    = 5;
    public static final int SIX      = 4;
    public static final int FIVE     = 3;
    public static final int FOUR     = 2;
    public static final int THREE    = 1;
    public static final int DEUCE    = 0;
    
    // Les couleurs.
    public static final int SPADES   = 3;
    public static final int HEARTS   = 2;
    public static final int CLUBS    = 1;
    public static final int DIAMONDS = 0;
    
    /** Symboles des numéroes de cartes. */
    public static final String[] RANK_SYMBOLS = {
        "2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"
    };
    
    /** Symbole des couleurs. */
    public static final char[] SUIT_SYMBOLS = { 'd', 'c', 'h', 's' };

    /** Le numéro. */
    private final int numeroCarte;
    
    /** La couleurCarte. */
    private final int couleurCarte;
    
    /**
     * Constructeur basé sur le numéro et la numero de la carte.
     * 
     * @param numeroCarte
     *            le numeroCarte.
     * @param couleurCarte
     *            la couleurCarte.
     * 
     * @throws IllegalArgumentException
     *             Si le numeroCarte ou couleurCarte est invalide.
     */
    public LaCart(int numero, int couleur) {
        if (numero < 0 || numero > NO_OF_RANKS - 1) {
            throw new IllegalArgumentException("Numéro invalide");
        }
        if (couleur < 0 || couleur > NO_OF_SUITS - 1) {
            throw new IllegalArgumentException("Couleur invalide");
        }
        this.numeroCarte = numero;
        this.couleurCarte = couleur;
    }
    
    /**
     * Constructeur basé sur un descriptif de la carte.
     * 
     * Le string doit etre sous la form numéro de la carte puis 
     * 
     * la couleur
     * 
     * @param s
     *            String representant la carte, e.g. "As", "Td", "7h".
     * 
     * @return La carte.
     * 
     * @throws IllegalArgumentException
     *            Si le string est nul ou ne repecte pas l'ordre ou 
     *            Dépase la taille 
     */
    public LaCart(String s) {
        if (s == null) {
            throw new IllegalArgumentException("Le string est nul ou taille invalide");
        }
        s = s.trim();
        if (s.length() != 2) {
            throw new IllegalArgumentException("Taille de la chaine invalide");
        }
        
        // Parser numeroCarte.
        String rankSymbol = s.substring(0, 1);
        char suitSymbol = s.charAt(1);
        int rank = -1;
        for (int i = 0; i < LaCart.NO_OF_RANKS; i++) {
            if (rankSymbol.equals(RANK_SYMBOLS[i])) {
                rank = i;
                break;
            }
        }
        if (rank == -1) {
            throw new IllegalArgumentException("Unknown rank: " + rankSymbol);
        }
        // Parser couleurCarte.
        int suit = -1;
        for (int i = 0; i < LaCart.NO_OF_SUITS; i++) {
            if (suitSymbol == SUIT_SYMBOLS[i]) {
                suit = i;
                break;
            }
        }
        if (suit == -1) {
            throw new IllegalArgumentException("Unknown suit: " + suitSymbol);
        }
        this.numeroCarte = rank;
        this.couleurCarte = suit;
    }
    
    /**
     * Returns la couleurCarte.
     * 
     * @return la couleurCarte.
     */
    public int getCouleurCarte() {
        return couleurCarte;
    }
    
    /**
     * Returns le numeroCarte.
     * 
     * @return le numeroCarte.
     */
    public int getNumeroCarte() {
        return numeroCarte;
    }
    
    /*
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        return (numeroCarte * NO_OF_SUITS + couleurCarte);
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof LaCart) {
            return ((LaCart) obj).hashCode() == hashCode();
        } else {
            return false;
        }
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    @Override
    public int compareTo(LaCart card) {
        int thisValue = hashCode();
        int otherValue = card.hashCode();
        if (thisValue < otherValue) {
            return -1;
        } else if (thisValue > otherValue) {
            return 1;
        } else {
            return 0;
        }
    }
    
    /*
     * (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return RANK_SYMBOLS[numeroCarte] + SUIT_SYMBOLS[couleurCarte];
    }
    
}
